package com.ys.day27.p5自定义线程池;

import java.util.concurrent.Callable;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 描述: TODO
 *
 *为什么要使用自定义线程池，而不是使用JDK提供的线程池工具方法呢？
 * public static ExecutorService newFixedThreadPool(int nThreads) {
 *     return new ThreadPoolExecutor(nThreads, nThreads,
 *                                   0L, TimeUnit.MILLISECONDS,
 *                                   new LinkedBlockingQueue<Runnable>());
 * }
 * 工具方法提供的线程池，有一个无界限队列，可以容纳的对象很多，N多个Runnable或者Callable对象都可以放入容器，
 * 有内存溢出的风险。阿里开发规约有一条：严禁使用无界限队列。
 *
 * 小结：大厂要求所有的线程必须在线程池中执行，不允许私自调用start()方法启动线程。
 * @author CodeYang
 * @version 2021/1/7 0:50
 */
public class P1自定义线程池了解与测试 {

    public static void main(String[] args) {
        try {
            ThreadPoolExecutor poll1 =  CustomThreadPoll.createThreadPool();
            ThreadPoolExecutor poll2 =  CustomThreadPoll.createThreadPool();

//            Integer t1 = TestObject.creteObject();
//            Integer t2 = TestObject.creteObject();
//            System.out.println(t1 == t2);
            System.out.println(poll1 == poll2);

            poll1.submit( new MyJobTest());
            poll1.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

class MyJobTest implements Callable<Integer>{
    /**
     *
     * @return
     * @throws Exception
     */
    @Override
    public Integer call() throws Exception {
        System.out.println("一个任务");
        return 1;
    }
}
